//
//  FunctionStudy.swift
//  Swift3.0_Study
//
//  Created by chengfeng on 2016/9/27.
//  Copyright © 2016年 zhaochengfeng. All rights reserved.
//

import Cocoa

class FunctionStudy: NSObject {
    /*
     函数是一段代码块和一个会意的名字.用于执行特定的任务
     使用函数叫“调用(call)”
     就像公式一样，使用函数需要提供参数
     函数调用的结果叫返回值
     函数都有类型，包含参数和返回值类型
     */
    func start() -> Void {
        /*
         定义函数
         
         形式：func 函数名(参数1:类型, 参数2:类型, ...) -> 返回结果的类型 {执行语句}
         调用：var 变量名称 =  函数名(变量1, 变量2, ...)
         🌰加法函数
         */
        
        print(self.add(x: 1, y: 3))
        
        welcome()
        let x = maxMin()
        print("Int min = \(x.min), max = \(x.max)")
        print(add(x: 1, y: 2, z: 3))
        
        print(add2(x: 1, increment: 3))
        print(add2(x: 1))
        
        print(caculate(x: 3, y: 4, method: multiply))
    }
    
    func add(x: Int, y: Int) -> Int {
        return x + y;
    }
    
    /*
     参数和返回值: 可以无参数无返回值
     无参数无返回值 .一般用于执行一系列操作,不需要结果.
     */
    func welcome() {
        print("欢迎")
        print("学习")
        print("Swift 3")
    }
    
    //多返回值（使用元组）返回值名称可以不带（min, max）
    func maxMin() -> (min: Int,max: Int) {
        return (Int.min, Int.max)
    }
    
    //参数以 名称: 类型 列出, 多个参数间用逗号分隔
    func add(x: Int, y: Int, z: Int) -> Int {
        return x + y + z
    }
    
    //可以给某个参数以默认值
    func add2(x: Int, increment: Int = 2) -> Int {
        return x + increment
    }
    
    
    
    //函数类型：包含参数和返回类型的简写形式，可以像普通变量那样使用,一般用于函数式编程. 🌰(Int,Int) -> Int
    func caculate(x: Int, y: Int, method: (Int, Int) -> Int) -> Int {
        return method(x, y)
    }
    
    func multiply(x: Int, y: Int) -> Int {
        return x * y
    }
    
    
}
